/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import modelo.Categoria;
import modelo.Consumidor;
import modelo.ConsumidorPersona;
import modelo.ConsumidorVivienda;
import modelo.Direccion;
import modelo.Persona;
import modelo.Usuario;
import negocio.CategoriaBI;
import negocio.ConsumidorBI;
import negocio.PersonaBI;
import negocio.UsuarioBI;
import pojos.DireccionVO;


/**
 *
 * @author Francisco
 */
@ManagedBean(name="crearConsumidor")
@ViewScoped
public class CrearConsumidorCtrl{
    
    @Inject
    private DireccionVO direccion;
    private LoginCtrl login;
    private String nombre;
    private String descripcion;
    private String tipo;
    private Map<String, String> tipos;
    {
        tipos = new HashMap<String, String>();
        tipos.put("General", "GENERAL");
        tipos.put("Persona", "PERSONA");
        tipos.put("Vivienda", "VIVIENDA");
        tipos.put("Ahorro", "AHORRO");
    }
    private Map<String, String> categorias;
    private List<String> categoriasSeleccionadas;
    private Boolean esPersona;
    private Boolean esVivienda;
    private Map<String,Integer> personas;
    private Integer personaSelec;
    @Inject
    private UsuarioBI usuarioBI;
    @Inject ConsumidorBI consumidorBI;
    @Inject CategoriaBI categoriaBI;
    @Inject PersonaBI personaBI;
    private Usuario usuario;
    
    @PostConstruct
    public void init(){
        try{
            login = (LoginCtrl)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("login");
            String nombreUsuario = login.getUsuario();
            usuario = usuarioBI.buscarUsuario(nombreUsuario);
            List<Persona> personasUsu = personaBI.buscarPersonasPorUsuario(usuario.getIdUsuario());
            personas = new HashMap<String, Integer>();
            for (Persona per : personasUsu) {
                personas.put(per.getNombre()+" "+per.getApellidoPaterno()+" "+per.getApellidoMaterno(), per.getIdPersona());
            }
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
    }
    
    public void guardar(){
        try{
            Consumidor conAnt = consumidorBI.buscarConsumidor(nombre, usuario.getIdUsuario());
            if(conAnt!=null){
                throw new Exception("El nombre de consumidor ya existe");
            }
            Consumidor consumidor =null;
            if(tipo.equals("GENERAL") || tipo.equals("AHORRO")){
                consumidor = new Consumidor();
            }else if(tipo.equals("PERSONA")){
                consumidor = new ConsumidorPersona();
            }else if(tipo.equals("VIVIENDA")){
                consumidor = new ConsumidorVivienda();
            }
            
            consumidor.setNombre(nombre);
            consumidor.setDescripcion(descripcion);
            consumidor.setIdUsuario(usuario);
            consumidor.setFechaCaptura(new Date());
            consumidor.setEstatus("A");
            consumidor.setTipo(tipo);

            List<Categoria> cats = new ArrayList<Categoria>();
            if(categoriasSeleccionadas != null && categoriasSeleccionadas.size()>0){
                for (String catSelec : categoriasSeleccionadas) {
                    cats.add(categoriaBI.buscarCategoria(Integer.parseInt(catSelec)));
                }
            }

            consumidor.setCategoriaList(cats);
                
            if(tipo.equals("GENERAL") || tipo.equals("AHORRO")){
                consumidorBI.crearGral(consumidor);
            }else if(tipo.equals("PERSONA")){
                ConsumidorPersona cp = (ConsumidorPersona)consumidor;
                if(personaSelec == null){
                    throw new Exception("Se debe elgir una persona");
                }
                Persona p = personaBI.buscarPersona(personaSelec);
                cp.setIdPersona(p);
                consumidorBI.crearPersona(cp);
            }else if(tipo.equals("VIVIENDA")){
                
                Direccion direccion = new Direccion();
                direccion.setCalle(this.direccion.getCalle());
                direccion.setNumeroExterior(this.direccion.getNumeroExterior());
                direccion.setEstado(this.direccion.getEstado());
                direccion.setPais(this.direccion.getPais());
                direccion.setCodigoPostal(this.direccion.getCodigoPostal());
                direccion.setColonia(this.direccion.getColonia());
                direccion.setNumeroInterior(this.direccion.getNumeroInterior());
                direccion.setRegion(this.direccion.getRegion());
                
                consumidorBI.crearVivienda((ConsumidorVivienda)consumidor, direccion);
            }
            
            cancelar();
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_INFO, "Listo", "Guardado con éxito"));
            
        }catch(Exception e){
            FacesContext.getCurrentInstance()
                    .addMessage(null, 
                        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", e.getMessage()));
        }
    }
    
    public void manejadorSeleccionoTipo(){
        if(tipo.equals("GENERAL") || tipo.equals("AHORRO")){
            esPersona = false;
            esVivienda = false;
        }else if(tipo.equals("PERSONA")){
            esPersona = true;
            esVivienda = false;
        }else if(tipo.equals("VIVIENDA")){
            esPersona = false;
            esVivienda = true;
        }
    }
    
    public void cancelar(){
        esPersona = false;
        esVivienda = false;
        direccion.setCalle("");
        direccion.setCodigoPostal("");
        direccion.setColonia("");
        direccion.setEstado("");
        direccion.setNumeroExterior("");
        direccion.setNumeroInterior("");
        direccion.setPais("");
        direccion.setRegion("");
        nombre = null;
        descripcion = null;
        tipo = null;
    }
    
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public DireccionVO getDireccion() {
        return direccion;
    }

    public void setDireccion(DireccionVO direccion) {
        this.direccion = direccion;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public Map<String, String> getCategorias() {
        return categorias;
    }

    public void setCategorias(Map<String, String> categorias) {
        this.categorias = categorias;
    }

    public List<String> getCategoriasSeleccionadas() {
        return categoriasSeleccionadas;
    }

    public void setCategoriasSeleccionadas(List<String> categoriasSeleccionadas) {
        this.categoriasSeleccionadas = categoriasSeleccionadas;
    }

    public Map<String, String> getTipos() {
        return tipos;
    }

    public void setTipos(Map<String, String> tipos) {
        this.tipos = tipos;
    }

    public Boolean getEsPersona() {
        return esPersona;
    }

    public void setEsPersona(Boolean esPersona) {
        this.esPersona = esPersona;
    }

    public Boolean getEsVivienda() {
        return esVivienda;
    }

    public void setEsVivienda(Boolean esVivienda) {
        this.esVivienda = esVivienda;
    }

    public Map<String, Integer> getPersonas() {
        return personas;
    }

    public void setPersonas(Map<String, Integer> personas) {
        this.personas = personas;
    }

    public Integer getPersonaSelec() {
        return personaSelec;
    }

    public void setPersonaSelec(Integer personaSelec) {
        this.personaSelec = personaSelec;
    }
    
}
